package view;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;


import model.Bericht;
import model.CiiBay;


/**
 * Hier worden alle gegevens van een bericht weergegeven.
 * @author Yasper 
 */
@SuppressWarnings("serial")
public class BerichtView extends JPanel {

	private Bericht bericht;
	private JButton reply;
	private JLabel naam;
	private CiiBay ciiBay;

	/**
	 * De constructor. Maakt het paneel aan en zet de informatie op het paneel
	 * @author Yasper
	 * @param b, ciiBay
	 */
	public BerichtView(Bericht bericht, CiiBay ciiBay) {
		this.ciiBay = ciiBay;
		this.bericht = bericht;
		reply = new JButton("Reply");
		naam = new JLabel("verzender: "+ bericht.getVerzender().getNaam(), JLabel.CENTER);
		reply.addActionListener(new ReplyListener());

		setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		setBackground(Color.ORANGE);
		c.gridy = 0;
		c.gridwidth = 2;
		c.insets = new Insets(5,0,0,0);
		add(new EnkelBerichtResultaat(bericht, ciiBay), c);
		c.gridy = 1;
		add(naam, c);
		c.gridy = 2;
		c.gridx = 1;
		c.insets = new Insets(25,0,0,0);
		c.gridx = 0;
		c.gridwidth = 2;
		add(new OmschrijvingPaneel(bericht), c);
		c.gridy = 3;
		add(reply, c);
	}

	/**
	 * Listener voor de reply knop
	 * @author Yasper
	 */
	class ReplyListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent arg0) {
			ciiBay.veranderView("mailbox");
			ciiBay.veranderView("nieuwBericht,"+bericht.getID());
		}
	}

	/**
	 * Paneel voor de omschrijving van het bericht
	 * @author Yasper
	 */
	class OmschrijvingPaneel extends JPanel{
		/**
		 * De constructor. Maakt het paneel aan en zet de informatie op het paneel
		 * @author Jaap
		 * @param b - Het bericht waar de info in staat
		 */
		public OmschrijvingPaneel(Bericht b){
			this.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.BLACK));
			this.setMaximumSize(new Dimension(150, 10));
			setLayout(new GridBagLayout());
			GridBagConstraints c = new GridBagConstraints();
			c.anchor = GridBagConstraints.NORTHWEST;
			c.gridx = 0;
			c.gridy = 0;
			JTextArea beschrijving = new JTextArea(getBeschrijving(b));
			beschrijving.setEditable(false);
			beschrijving.setBackground(Color.ORANGE);
			add(beschrijving, c);
			setBackground(Color.ORANGE);
		}


		/**
		 * Deelt de beschrijving op in een (onbepaald) aantal regels. Een regel is maximaal 65 karakters lang zodat de layout goed blijft.
		 * Deze functie split de beschrijving eerst in regels op, en daarna per regel in woorden. Maakt vervolgens nieuwe regels aan die niet langer zijn dan 65 karakters.
		 * @param b - Het bericht waar de beschrijving in staat.
		 * @return beschrijving - De beschrijving zoals deze in de zoekresultaten zal verschijnen
		 * @author Jaap
		 */
		public String getBeschrijving(Bericht b){
			//Max regel lengte 65!!!!!
			String[] beschrijvingArray = b.getOmschrijving().split("\n");
			ArrayList<String> beschrijvingLijst = new ArrayList<String>();
			for(String s : beschrijvingArray){
				String[] woordenPerZin = s.split(" ");
				for(String woord : woordenPerZin){
					String kleinWoord = "";
					if((woord.length() > 65)){
						kleinWoord = woord.substring(0, 65);
					}else{
						kleinWoord = woord;
					}

					if(beschrijvingLijst.size() > 0){
						String regel = beschrijvingLijst.get(beschrijvingLijst.size() - 1);
						if(regel.length() < 65){
							if(((regel.length() + woord.length()) + 1) <= 65){
								regel = regel + " " + kleinWoord;
								beschrijvingLijst.remove(beschrijvingLijst.size() - 1);
								beschrijvingLijst.add(regel);
							}else{
								String nieuweRegel3 = "\n" + kleinWoord;
								beschrijvingLijst.add(nieuweRegel3);
							}
						}else{
							String nieuweRegel2 = "\n" + kleinWoord;
							beschrijvingLijst.add(nieuweRegel2);
						}
					} else {
						String nieuweRegel1 = kleinWoord;
						beschrijvingLijst.add(nieuweRegel1);
					}
				}
			}
			String beschrijving = "";
			for(String regel : beschrijvingLijst){
				beschrijving += regel;
			}
			return beschrijving;
		}
	}
}
